﻿using System;
using Csharp关于类的练习;


namespace Csharp类的继承
{

    #region 类讲解 class 人和学生
    // class Person 
    //{
    //    public string name;//问题----------->把public变成private 下面的学生类还拥有嘛？
    //    public string sex;
    //    public int age;


    //    public void SayHello() 
    //    {
    //        Console.WriteLine("{0}说世界你好！",name);
    //    }

    //}

    ////继承类
    //class Student : Person //拿到了person所有东西
    //{
    //    public int csharp;
    //    public int unity;

    //    public void ShowScore() 
    //    {
    //        int sum = csharp + unity;
    //        int avg = sum / 2;
    //        Console.WriteLine("{0}的总分成绩是{1}，平均分是{2}",name,sum,avg);
    //    }


    //}
    #endregion


    #region 练习1---人

    //class Person 
    //{
    //    public string name;
    //    public string sex;
    //    public int age;
    //    public string hobby;

    //    //构造函数————————子类会默认调用
    //    public Person(string name) 
    //    {
    //        this.name = name;
    //        Console.WriteLine("我是基类");
    //    }

    //    public Person(string name, int age) : this(name) 
    //    {

    //    }




    //    public void ShowMe ()
    //    {
    //        Console.WriteLine("我是{0}，今年{1}岁了，性别是{2}，爱好是{3}，世界你好！", name,age,sex,hobby);
    //    }

    //}


    //#region 记者

    //class Report : Person 
    //{
    //    //new string name;//自身的name把父类的同名的name隐藏了
    //    //new的作用------------------>
    //    //1.实例化一个对象
    //    //2.为子类的成员申请一个新空间----------------》
    //    //如果子类中有成员与父类中的成员同名
    //    //---------》可以用new关键字为子类中这个成员新开一个空间----》以便计算机识别，如果不写默认调用new


    //    public Report(string name) : base(name) { }//--------->base指定父类
    //    public void TakePhoto() 
    //    {
    //        Console.WriteLine("{0}在偷拍",name);

    //    }
    //}
    //#endregion



    //#region 司机

    //class Driver : Person
    //{
    //    public Driver(string name) : base(name) { }//--------->base指定父类
    //    public void PlayBasketball()
    //    {
    //        Console.WriteLine("{0}在打篮球", name);

    //    }
    //}
    //#endregion

    //#region 

    //class Programmer : Person
    //{
    //    public Programmer(string name) : base(name) { }//--------->base指定父类
    //    public void WatchMovie()
    //    {
    //        Console.WriteLine("{0}在看电影", name);

    //    }
    //}
    #endregion



    class monster : GameObject {
        public monster(string icon, int x, int y, int width, int height, ConsoleColor color) :base(icon, new Vector2(x, y), new Vector2(width, height), color)
        {
        
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            #region 对象的继承(封装，继承，多态)
            //面向对象的继承
            //Teacher
            //树-----类(继承)---(思想)
            //继承是C#中面向对象的重要概念，用一个已存在的类，定义一个新的类，又叫子类，已存在的类叫父类
            //所有类的父亲-------------------是object的类型(诞生了所有类和所有结构体)
            //默认继承了object类型--------------C#中所有类的最终基类都是object类
            //子类会默认调用父亲的默认构造函数
            //如果父类的默认构造函数失效，子类需要重新指定()




            //一个类可以直接继承一个类，可以间接继承好几个类 

            //访问修饰符 class 派生类名:基类名      ----------------》:表示继承
            //{
            //   
            //}

            #endregion

            #region 实例对象练习1

            //Person p=new Person();
            //p.name = "小明";
            //p.sex = "男";
            //p.age = 18;
            //p.SayHello();

            //Student s = new Student();
            //s.name = "小花";
            //s.age = 17;
            //s.csharp = 85;
            //s.unity = 90;

            //s.SayHello();
            //s.ShowScore();


            //Report r = new Report("狗仔");
            ////r.name = "狗仔";
            //r.sex = "男";
            //r.age = 34;
            //r.hobby = "偷拍";

            //Driver d = new Driver("张三");
            ////d.name = "张三";
            //d.sex = "男";
            //d.age = 43;
            //d.hobby = "打篮球";


            //Programmer p = new Programmer("李四");
            ////p.name = "李四";
            //p.sex = "男";
            //p.age = 23;
            //p.hobby = "看电影";

            //r.ShowMe();
            //r.TakePhoto();

            //d.ShowMe();
            //d.PlayBasketball();

            //p.ShowMe();
            //p.WatchMovie();

            #endregion

            #region 访问修饰符
            //public 访问修饰符
            //Protected 派生类和本类可以访问
            //Internal 访问限于当前程序集（.exe  .dll等）
            //protected internal   先判定是否在同一程序集，而后判定是否为派生类
            //private 只能访问本类

            //访问修饰符
            //public公开的
            //private私有的
            //protected继承
            //internal本程序集（类的默认访问)
            //引用其他程序集，使用using语法
            //也可以直接通过dot语法，找到对应的命名空间.类名

            //命名空间
            //同一命名空间下的东西不能重名，可以直接调用
            //不同命名空间下的类，找到对应的命名空间.类名



            //this与base

            //this关键字----->this关键字指向自身实例或者自身构造函数
            //base关键字----->base关键字指向父类的实例或者父类的构造函数



            //类引用
            //people laopo = new people("小黄", 1.63f, 20, false);
            //Csharp关于类的练习.people laoxiao=new people("小黄", 1.63f, 20, false);




            #endregion



            #region 里氏转换


            //子类对象可以当做父类对象使用（甚至可以转成父类去使用)---->因为子类拿到了父类的所有内容
            //如果父类对象中装的是子类对象，我们可以将他强转成子类对象,并且去使用------>父类变量可以装载子类

            //Person x = new Programmer("老王");
            //((Programmer)x).WatchMovie();//强转成programmer，去使用

            //<-----------is和as尽量搭配使用----------------->
            //<--------------避免空引用报错------------------>

            //if (x is Programmer)
            //{
            //    Programmer p1 =(x as Programmer);
            //    p1.WatchMovie();
            //}

            //is
            //表示类型转换，如果能够转换成功，则返回一个true，否则返回一个false;
            //as
            //表示类型转换，如果能够转换则返回对应的对象，否则返回null
            #endregion

            #region  Monster两个类--练习
            //书写一个Monster，他派生出Boss和Goblin两个类，
            //Boss有技能和攻击，呼唤小怪，小怪有攻击
            //然后生成十个怪，十个怪随机生成boss和哥布林
            //装到一个数组里，遍历数组调用他们的攻击，如果boss就放技能

            //Monster[] monsters = new Monster[10];//创建数组

            //Random r = new Random();//随机数

            //for (int i = 0; i < 10; i++) 
            //{
            //    int rate = r.Next(1,101);
            //    if (rate >= 80)//20%的纪律
            //    {
            //        monsters[i] = new Boss("第" + i + "号Boss");
            //    }
            //    else 
            //    {
            //        monsters[i] = new Goblin("第" + i + "号Goblin");
            //    }      
            //}

            ////放招
            //for (int i = 0; i < monsters.Length; i++)
            //{
            //    if (monsters[i] is Boss) //判断能不能转换
            //    {

            //        Boss temp = monsters[i] as Boss;
            //        temp.Skill();
            //    }
            //    else 
            //    {
            //        monsters[i].Attack();
            //    }
            //}





            #endregion

            #region 练习二

            //书写一个GameQbject类，有这些的属性:位置、大小，颜色
            //有这样的方法图形绘制(Draw)图形擦除(Remove）和移动(Move)的方法

            //上下左右，监听按键


            GameObject go = new GameObject("▅", 5, 5, 10, 10, ConsoleColor.Blue);
            go.Draw();
            go.remove();

            //monster m = new monster("▲", 10, 7, 3, 3, ConsoleColor.DarkCyan);
            //m.Draw();
            //m.remove();//为啥只能移动一小部分
            #endregion




        }
    }
}
